home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagn_r.zip / NUMBERS.SWG / 0023_TP6RAND.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  1KB  |  70 lines

  1. {
  2. Borland changed the Random() algorithm between TP6 and TP/BP7.  The Unit
  3. below provides the TP6 Random Function in its Integer flavour.  (The
  4. Randomize Procedure wasn't changed.)
  5.  
  6. { *  Turbo Pascal Runtime Library Version 6.0     * ;
  7.   *  Random Number Generator                      * ;
  8.   *                                               * ;
  9.   *  Copyright (C) 1988,92 Borland International  * }
  10.  
  11. Unit TP6Rand;
  12.  
  13. Interface
  14.  
  15. Function Random(Max: Integer): Integer;
  16.  
  17. Implementation
  18.  
  19. Const
  20.   { Scaling Constant}
  21.   ConstM31 = LongInt(-31);
  22.   { Multiplication factor}
  23.   Factor: Word = $8405;
  24.  
  25.  
  26. Function NextRand: LongInt; Assembler;
  27. {
  28.   Compute next random number
  29.   New := 8088405H * Old + 1
  30.   Out  DX:AX = Next random number
  31. }
  32. Asm
  33.   MOV  AX,RandSeed.Word[0]
  34.   MOV  BX,RandSeed.Word[2]
  35.   MOV  CX,AX
  36.   MUL  Factor.Word[0]     { New = Old.w0 * 8405H }
  37.   SHL  CX,1               { New.w2 += Old.w0 * 808H }
  38.   SHL  CX,1
  39.   SHL  CX,1
  40.   ADD  CH,CL
  41.   ADD  DX,CX
  42.   ADD  DX,BX              { New.w2 += Old.w2 * 8405H }
  43.   SHL  BX,1
  44.   SHL  BX,1
  45.   ADD  DX,BX
  46.   ADD  DH,BL
  47.   MOV  CL,5
  48.   SHL  BX,CL
  49.   ADD  DH,BL
  50.   ADD  AX,1      { New += 1 }
  51.   ADC  DX,0
  52.   MOV  RandSeed.Word[0],AX
  53.   MOV  RandSeed.Word[2],DX
  54. end;
  55.  
  56. Function Random(Max: Integer): Integer; Assembler;
  57. Asm
  58.  CALL  NextRand
  59.  xor   AX,AX
  60.  MOV   BX,Max.Word[0]
  61.  or    BX,BX
  62.  JE    @@1
  63.  XCHG  AX,DX
  64.  div   BX
  65.  XCHG  AX,DX
  66. @@1:
  67. end;
  68.  
  69. end.
  70.